// storage.js - 带过期时间的 localStorage 封装

/**
 * 设置带过期时间的 localStorage
 * @param {string} key - 存储的键
 * @param {any} value - 存储的值
 * @param {number} expire - 过期时间（毫秒），默认 7 天
 */
export const setStorage = (key, value, expire = 7 * 24 * 60 * 60 * 1000) => {
  const data = {
    value: value,
    expire: expire ? Date.now() + expire : null,
    createTime: Date.now()
  };
  
  localStorage.setItem(key, JSON.stringify(data));
};

/**
 * 获取 localStorage，会自动检查是否过期
 * @param {string} key - 存储的键
 * @returns {any} 返回存储的值，如果过期或不存在则返回 null
 */
export const getStorage = (key) => {
  const data = localStorage.getItem(key);
  
  if (!data) {
    return null;
  }
  
  try {
    const parsedData = JSON.parse(data);
    
    // 检查是否有过期时间设置
    if (parsedData.expire) {
      // 检查是否过期
      if (Date.now() > parsedData.expire) {
        console.log(`存储 ${key} 已过期，自动清除`);
        localStorage.removeItem(key);
        return null;
      }
    }
    
    return parsedData.value;
  } catch (error) {
    console.error(`解析存储 ${key} 失败:`, error);
    return null;
  }
};

/**
 * 移除 localStorage
 * @param {string} key - 存储的键
 */
export const removeStorage = (key) => {
  localStorage.removeItem(key);
};

/**
 * 清空所有 localStorage
 */
export const clearStorage = () => {
  localStorage.clear();
};

/**
 * 检查存储是否存在且未过期
 * @param {string} key - 存储的键
 * @returns {boolean}
 */
export const hasStorage = (key) => {
  return getStorage(key) !== null;
};

/**
 * 更新存储的过期时间
 * @param {string} key - 存储的键
 * @param {number} expire - 新的过期时间（毫秒）
 */
export const updateExpire = (key, expire) => {
  const value = getStorage(key);
  if (value !== null) {
    setStorage(key, value, expire);
  }
};

/**
 * 获取存储的剩余有效时间（毫秒）
 * @param {string} key - 存储的键
 * @returns {number|null} 剩余时间，如果没有过期时间设置则返回 null
 */
export const getRemainTime = (key) => {
  const data = localStorage.getItem(key);
  
  if (!data) {
    return null;
  }
  
  try {
    const parsedData = JSON.parse(data);
    
    if (parsedData.expire) {
      const remainTime = parsedData.expire - Date.now();
      return remainTime > 0 ? remainTime : 0;
    }
    
    return null;
  } catch (error) {
    return null;
  }
};

// 预设的过期时间常量
export const EXPIRE_TIME = {
  MINUTE: 60 * 1000,              // 1分钟
  HOUR: 60 * 60 * 1000,           // 1小时
  DAY: 24 * 60 * 60 * 1000,       // 1天
  WEEK: 7 * 24 * 60 * 60 * 1000,  // 1周（默认）
  MONTH: 30 * 24 * 60 * 60 * 1000, // 30天
  NEVER: null                      // 永不过期
};

/**
 * 用户信息相关的存储 API
 */
export const userStorage = {
  // 保存用户信息（默认 7 天过期）
  setUserInfo: (userInfo, expire = EXPIRE_TIME.WEEK) => {
    setStorage('user_info', userInfo, expire);
  },
  
  // 获取用户信息
  getUserInfo: () => {
    return getStorage('user_info');
  },
  
  // 清除用户信息
  clearUserInfo: () => {
    removeStorage('user_info');
    removeStorage('token');
    removeStorage('isLoggedIn');
  },
  
  // 检查用户是否已登录
  isLoggedIn: () => {
    return hasStorage('user_info');
  },
  
  // 刷新用户信息的过期时间（延长登录状态）
  refreshUserInfo: (expire = EXPIRE_TIME.WEEK) => {
    updateExpire('user_info', expire);
  },
  
  /**
   * 验证用户信息是否有效（用于请求拦截器）
   * @returns {boolean} 如果用户信息有效返回 true，否则返回 false
   */
  validateUserInfo: function() {
    // 使用 getUserInfo 获取用户信息（会自动检查过期时间）
    const userInfo = this.getUserInfo();
    
    // 检查 user_info 是否存在
    if (!userInfo) {
      console.warn('user_info 不存在或已过期');
      return false;
    }

    // 检查 userInfo 是否为对象
    if (typeof userInfo !== 'object') {
      console.warn('user_info 格式错误');
      return false;
    }

    // 检查手机号是否存在且有效
    const phone = userInfo.phone;
    if (!phone || phone === undefined || phone === null || (typeof phone === 'string' && phone.trim() === '')) {
      console.warn('user_info 中手机号无效');
      return false;
    }

    return true;
  }
};

/**
 * Token 相关的存储 API
 */
export const tokenStorage = {
  // 保存 token
  setToken: (token, expire = EXPIRE_TIME.WEEK) => {
    setStorage('token', token, expire);
  },
  
  // 获取 token
  getToken: () => {
    return getStorage('token');
  },
  
  // 清除 token
  clearToken: () => {
    removeStorage('token');
  }
};

export default {
  set: setStorage,
  get: getStorage,
  remove: removeStorage,
  clear: clearStorage,
  has: hasStorage,
  updateExpire,
  getRemainTime,
  EXPIRE_TIME,
  user: userStorage,
  token: tokenStorage
};

